package utils

import (
	"crypto/md5"
	"fmt"
	"strings"

	"golang.org/x/crypto/bcrypt"
)

/**
* 创建密码散列（hash）
 */
func HashPassword(password string) (string, error) {
	bytes, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
	return string(bytes), err
}

/**
* 验证密码是否和散列值匹配
* @param password 密码
* @param hash     散列值
* @param extend   扩展数据，可包含salt等信息
 */
func VerifyPassword(password, hash string, extend map[string]string) bool {
	// 检查是否为标准密码散列格式(bcrypt等)，通常以$开头
	if strings.HasPrefix(hash, "$") {
		// 使用bcrypt验证
		err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
		return err == nil
	} else {
		// 兼容旧版MD5加密密码
		salt, exists := extend["salt"]
		if !exists {
			salt = ""
		}
		return EncryptPassword(password, salt) == hash
	}
}

/**
* 旧版MD5加密密码方式
* @param password 密码
* @param salt     盐值
 */
func EncryptPassword(password, salt string) string {
	// 实现与PHP版本相同的MD5加密逻辑
	return fmt.Sprintf("%x", md5.Sum([]byte(password+salt)))
}
